﻿using System.Diagnostics;

namespace WJP.ManagedProperty
{
    /// <summary>
    /// 托管属性的字段
    /// </summary>
    [DebuggerDisplay("{DebuggerDisplay}")]
    public struct ManagedPropertyField
    {
        private static readonly object DefaultValue = new Utils.DefaultValue();

        /// <summary>
        /// 对应的托管属性
        /// </summary>
        public IManagedProperty Property { get; private set; }

        /// <summary>
        /// 字段的值
        /// </summary>
        public object Value { get; private set; }

        /// <summary>
        /// 返回字段是否已经有值，而非使用默认值。
        /// <para>有时 Value 属性的值会被设置为字段的默认值，虽然这时 HasValue 为真，但是值本身还是默认值，</para>
        /// 所以不能简单地通过这个属性来判断是否本字段的值是默认值。
        /// </summary>
        internal bool HasValue
        {
            get
            {
                return Value != DefaultValue;
            }
        }

        /// <summary>
        /// 重置字段的值为<see cref="DefaultValue"/>
        /// </summary>
        internal void ResetValue()
        {
            Value = DefaultValue;
        }

        /// <summary>
        /// 重置字段对应的托管属性，并且值设置为<see cref="DefaultValue"/>
        /// </summary>
        /// <param name="property"></param>
        internal void ResetToProperty(IManagedProperty property)
        {
            Property = property;
            Value = DefaultValue;
        }

        /// <summary>
        /// Debugger时的显示值
        /// </summary>
        private string DebuggerDisplay
        {
            get
            {
                return DefaultValue.ToString();
            }
        }
    }
}
